---
title: "Short-term trade dependencies of the South as an obstacle to degrowth? Quantifying the twin challenge of global dependencies"
author:
  - name: "Claudius Gräbner-Radkowitsch"
    affiliation: "Department of Pluralist Economics, Europa Universität Flensburg, Germany; Institute for the Comprehensive Analysis of the Economy, Johannes Kepler University Linz, Austria"
    email: "claudius.graebner-radkowitsch@uni-flensburg.de"
  - name: "Birte Strunk"
    affiliation: "Department of Economics, Bard College, United States"
    email: "bstrunk@bard.edu"
date: today
abstract: |
  This paper is a first attempt to quantify the potential short-term effects on income and business profits that may occur in the Global South if the Global North were to implement policies to reduce and relocalize consumption and production. To this end, we use the EORA26 global input-output table to calculate dependency shares, which capture the share of incomes and profits in the Global South that manifests because of trade with the Global North. In the aggregate, we find that roughly a seventh of total incomes and profits in the South depends on trade in the North, although dependency varies significantly by region. We find that most of this dependency stems from trade of intermediate goods, not from exports for final demand. We also find that there is no single factor beyond trade-openness that clearly explains the differences in dependency among countries in the South, pointing to the importance of country-specific analyses. We therefore argue that a deeper understanding of the specific trade relations of any given country in the Global South with countries of the North is necessary for researchers interested in post-growth industrial policy as well as, more broadly, any type of policy-driven degrowth transitions in the Global North.
keywords: [degrowth, unequal exchange, structural dependencies, input-output analysis, Global North, Global South, trade, delinking, decolonization]

format:
  docx:
    toc: false
    number-sections: true
    reference-doc: TEMPLATE.docx
    highlight-style: github
    fig-cap-location: bottom
    df-print: kable
    tbl-colwidths: auto
    tbl-cap-location: top
    fig-format: png
    fig-dpi: 300
    fig-width: 6
    fig-height: 4
    echo: false
    warning: false
    message: false
  pdf:
    documentclass: article
    geometry: 
      - margin=1in
    fontsize: 12pt
    linestretch: 2
    number-sections: true
    fig-cap-location: bottom
    tbl-cap-location: top
    fig-pos: "H"
    fig-width: 6
    fig-height: 4
    df-print: kable
    echo: false
    warning: false
    message: false
bibliography: GlobalDependencies.bib
csl: chicago-author-date.csl
citation-style: author-date
suppress-bibliography: false
link-citations: true
colorlinks: true
fontfamily: times
mainfont: "Times New Roman"
sansfont: "Arial"
monofont: "Courier New"
---

``` {python}
# Set up the data
import json
import pandas as pd 
import wbdata
import mario #to install this: pip install mariopy
import matplotlib.pyplot as plt 
import numpy as np
import pymrio
import subprocess
import os
from pathlib import Path

def here(*args):
    """Python equivalent of R's here() function"""
    # Find project root by looking for common project markers
    current = Path.cwd()
    while current != current.parent:
        markers = [".git", "requirements.txt", ".python-version", "pyproject.toml"]
        if any((current / marker).exists() for marker in markers):
            project_root = current
            break
        current = current.parent
    else:
        project_root = Path.cwd()
    
    # Join the provided path components
    return project_root.joinpath(*args)

def format_millions(value):
    """Format large numbers in millions with M suffix"""
    return f"{value/1_000_000:.1f}M"

def format_thousands(value):
    """Format numbers in thousands with K suffix"""
    return f"{value/1_000:.0f}K"

def format_currency(value):
    """Format currency values in millions"""
    return f"${value:.1f}"

def format_currency_millions(value):
    """Format currency values in millions"""
    return f"${value/1_000_000:.1f}M"

def format_with_commas(value):
    """Format numbers with comma separators"""
    return f"{value:,.0f}"

def format_number(value, decimals=0):
    """Format numbers"""
    return f"{value:,.{decimals}f}"

def format_percentage(value, decimals=1):
    """Format as percentage with specified decimal places"""
    return f"{value:.{decimals}f}%"

def smart_format(value, threshold_millions=1_000_000, threshold_thousands=1_000):
    """Automatically choose the best format based on value size"""
    if abs(value) >= threshold_millions:
        return format_millions(value)
    elif abs(value) >= threshold_thousands:
        return format_thousands(value)
    else:
        return f"{value:.1f}"

eora_path = here("data", "raw", "Eora26_2017_bp.zip")
indices_path = here("data", "raw", "indices.zip")
population_overview_path = here("data", "tidy", "population_overview.csv")
population_data_path = here("data", "tidy", "population_data.csv")

population_overview = pd.read_csv(population_overview_path)
population_data = pd.read_csv(population_data_path)
eora_pymrio = pymrio.parse_eora26(year=2017, path=str(eora_path))

pop_north = population_overview.loc[population_overview["region"] == "GlobalNorth", "Population"]
pop_south = population_overview.loc[population_overview["region"] == "GlobalSouth", "Population"]
pop_china_india = population_overview.loc[population_overview["region"] == "ChinaIndia", "Population"]
        
population_north_final = int(pop_north.iloc[0]) if len(pop_north) > 0 else 0
population_south_final = int(pop_south.iloc[0]) if len(pop_south) > 0 else 0
population_china_india_final = int(pop_china_india.iloc[0]) if len(pop_china_india) > 0 else 0    

# eora_pymrio.calc_all()
eora_mario = mario.parse_from_pymrio(
    io=eora_pymrio, 
    value_added={'VA': 'all'},
    satellite_account = {'Q': 'all'})
eora_mario.calc_all()

with open(here("data", "tidy", "north_codes.json")) as f:
    north_codes = set(json.load(f))

with open(here("data", "tidy", "south_codes.json")) as f:
    south_codes = set(json.load(f))
```


# Introduction

The starting point and motivation of this paper is the conjecture of a "twin challenge of global dependencies" [@grabner-radkowitsch2023], i.e. the apprehension that within the current institutional framework of the global economy, structural dependencies between the Global North and South are a motivation for, and a potential obstacle to degrowth at the same time. On the one hand, degrowth scholars criticize the Western  development model for being based on a form of growth and global economic integration that in many places of the world erodes the grounds for sustainable and decent living conditions, threatens alternative ways of provisioning, such as subsistence-oriented lifestyles, and leaves workers exposed to global capitalism and inclusion into its wage relations as the main means of securing a livelihood -- a trend only made worse by climate change. Degrowth scholars who point out these neocolonial economic relations often refer to the literature on ecologically unequal exchange between the Global North and South, to the detriment of the latter [@dorninger2021; @hickel2022]. In moving away from global capitalism, degrowth is envisioned as a step toward decolonization and toward greater justice in the global economic system, with eliminating unequal trade relations between the North and South as one crucial element [@hickel2021; @hickel2021a].

On the other hand, it is these very dependencies in the areas of international trade and finance, that give rise to fears of potential short-term adverse effects of implementing degrowth policies in the North on the South, especially in the absence of adequate regional policy coordination [@althouse2020; @chiengkul2018; @dengler2019; @frame2023]. So far, degrowth scholarship has focused more on pointing out the way in which degrowth aligns with regional, bottom-up thought and action in the South [e.g. @beling2018; @escobar2015; @gerber2018; @kothari2014], and on highlighting that the challenges implied by potential short-term adverse effects should not be used as an argument *against* degrowth [@hickel2021]. The flip side of the twin challenge of global dependencies, however, has not received as much attention in the degrowth literature, especially when it comes to the quantification of the relevance of these dependencies [see Fevereiro and Lowe -@fevereiro2025 for a recent exception that takes a different, but complementary approach to the one we outline below]. 

This is where the present paper aims to make a contribution. We approach the topic of dependencies through the lens of global trade.^[
    For finance, see e.g. Althouse et al. [-@althouse2020]; Althouse and Svartzman [-@althouse2022]; Svartzman and Althouse [-@svartzman2022]; for delinking more broadly, see e.g. Ricci [-@ricci2025]] 
Our research question is the following: How dependent are countries from the Global South from exports to the Global South, when it comes to incomes and profits? How heterogeneous is this dependency across countries? To this end, we assume a planned, democratic reduction in consumption and production in the North [@schmelzer2023] and study the implied relocalization of production and consumption and thus the imlied reduction of trade with the South. More precisely, we use input-output modelling to quantify the share of total value added (in various dimensions) in the Global South that can be attributed to exports into the Global North. In a hypothetical scenario where the Global North would reduce or restructure its demand in an orientation toward more regional economies, it is this share that would be affected and that potentially threatens the incomes attached to it. These dependency shares are thus a core element of understanding how a degrowth transition in the Global North might have effects on the Global South. It is important, however, to point out that the actual effects in the South could be much lower, depending on how much of the exports to the North were replaced by exports to other countries in the South, and how the affected activities were relocated within domestic economies.

Our main contribution is twofold. On a methodological level, we suggest that dependency shares are a useful analytical tool to quantify the side of the twin challenge of global dependencies that has, thus far, not received adequate attention in the degrowth literature: the vulnerability of Global South economies to demand reductions in the Global North. On a substantive level, our findings show that significant trade dependencies exist, with a global average of 13.59% of value added in the South attributable to exports to the North. The largest part of these dependencies is not due to final demand in the North, but to intermediate demand, i.e. to producers in the North purchasing intermediate goods and services. Regionally, the dependencies are very heterogeneous, and dependency shares reach from almost nothing in the least dependent up to 30-40% in the most dependent countries. Using a regression model, we show that beyond the obvious factor of trade openness, there is no single, clear macroeconomic factor that explains the dependency of a given country, indicating that further research particularly on the country level is warranted.

The remainder of this paper is structured as follows: we will first provide more context and motivation through a literature review (@sec-litreview). @sec-method presents our data and methodology, and @sec-results our results. In @sec-discussion, we discuss our results and conclude. The code to replicate the findings in this paper is published as Gräbner-Radkowitsch and Strunk [-@dependencecode]. More background information, methodological explanations, diagnostics and robustness checks are available through a supplementary online appendix.

# Literature Review {#sec-litreview}

Degrowth aims for a planned reduction of economic activity in the Global North that explicitly targets global justice [@schmelzer2023]: it entails "an equitable downscaling of production and consumption that increases human wellbeing and enhances ecological conditions at the local and global level, in the short and long term" [@schneider2010, 512]. While originally being a movement rooted in bottom-up activism and strongly inspired by Southern critiques of development [@latouche2009; @martinez-alier2010], it has in recent years additionally branched out into more mainstream policy spaces, bringing along questions around economic planning and policy design [@cosme2017; @fitzpatrick2022; @schmelzer2023], including industrial policy [@hauge2025; @barnthaler2025]. Degrowth policy proposals are primarily focused on the domestic (often regional or municipal) level, consistent with degrowth's postcolonial aspiration for the North to "set their own house in order", rather than setting a new, neocolonial agenda for the globe [@agarwal1991, 16; @dengler2019, 248]. However, a range of scholars have pointed out that in doing so, degrowth has remained too silent on the imperialist roots of global capitalism and of the wealth levels of the North [@hickel2021a; @tyberg2021], and the structural dependencies between countries that question the feasibility to study single countries or regions in isolation [e.g, @Degrowth23]. According to some, degrowth therefore needs to start paying more attention to the world-systems level of global capitalism [@frame2023], lest it become an inward-looking and provincial project [@schmelzer2023a] that does not live up to its goal of enhancing global justice.


The critique of the imperialist roots of Western development and its neocolonial repercussions have indeed started to receive more attention in the degrowth literature in recent years. Degrowth literature has, for example, started to engage with the literature around ecologically unequal exchange.^[
    While neoclassical theory assumes that all exchange is by definition free and voluntary, the literature on unequal exchange, both in its Marxist and its ecological variant, argue that in real-world economies there are a range of structural asymmetries between economies of the core and (semi-)periphery that come with enforced and asymmetric exchange relations [e.g. @hornborg2023]. In its Marxist/structuralist variant, this research elaborates, e.g., on how differences in technology access or labor costs allow core economies to extract surplus value from peripheral economies through unequal terms of trade [for a detailed overview of dependency theory, see e.g. Kvangraven -@kvangraven2023].] 
These contributions provide a host of empirical work showing that rich countries benefit from a net transfer of embodied materials, energy, and labor time from the Global South to the Global North (often using the language of 'core' and 'periphery'), while systematically displacing environmental costs of production processes to poorer regions (for an overview of the field, see Hornburg [-@hornborg2023]; for recent studies, see e.g. Schaffartzik et al. [-@schaffartzik2019] or Dorninger et al. [-@dorninger2021]). There has recently emerged a literature that explicitly connects ecologically unequal exchange with degrowth [@hickel2022; @hickel2024; @ricci2025], giving more empirical substance to the claim that degrowth aims to promote not just local but also global justice.

So far, this literature has mainly focused on using these empirical tools to strenghen the degrowth critique of global capitalism. Hickel [-@hickel2021], for instance, points out that due to global power imbalances and asymmetric dependencies between the North and South, "some worry that degrowth in the North might have a negative impact on economies in the South" [p. 5; see e.g. Chiengkul -@chiengkul2018 as someone who, while sympathetic to degrowth, raises this concern]. He argues that using this risk as an argument against degrowth as a whole is problematic, as it "echoes arguments that were regularly made under colonialism, namely, that extraction and exploitation by the colonizer is ultimately good for the colonized" (ibid.). In that sense, the very existence of these exploitative dependencies is a reason *for* degrowth—and thus one side of the "twin challenge of global dependencies" [@Degrowth23].

However, while it is indeed problematic to use these dependencies as a fundamental argument *against* degrowth, they surely should be understood as an obstacle to implementing a purely domestically oriented degrowth policy-program in the North. The risk of short-term adverse effects in the South, if certain degrowth policies were implemented in the North, is a relevant flipside of the "twin challenge of global dependencies". Althouse et al. [-@althouse2020], for example, show that although growth in the core is indeed socially and ecologically harmful in the periphery, it nonetheless "presents a major source of economic demand and supports socioeconomic stability [in the South] under existing institutional frameworks" (p. 8). A sudden and significant demand drop in the core might indeed lead to declining welfare, greater inequality, and higher unemployment in the periphery. Althouse et al. [-@althouse2020] therefore highlight the importance of regional policy coordination and argue that degrowth scholarship needs to investigate more thoroughly what effects degrowth in the center might have on the periphery. Such consideration of the potential short-term effects in the South is also warrented by a postcolonial methodology, which would put special attention on the effects of the particularly disadvantaged populations [e.g., @go].

Despite a range of methodological challenges, there are now a few first attempts at addressing this question [@leoni2024; @fevereiro2025]. It is precisely this research agenda that our paper tries to contribute to. In the following, we use input-output analysis to investigate currently-existing dependency relations between the North and the South with a focus on trade, tracing the amount of value added (income and business profits) in the South that depends on exports to —- and thus demand from -- the North. This allows us to provide a quantitative estimate of the risk of short-term adverse effects of Northern reductions in consumption and production on the South. Rather than using such an estimate in a theoretical debate around the desirability or necessity of degrowth, we see it as an integral part to the degrowth literature that deals with industrial policy, political strategy, and transition design.


# Methodology {#sec-method}

To answer our research question we used the EORA26 Input-Output Tables. We aggregated countries into the Global North and South and then calculated dependency shares of various factors of value added that quantify the trade dependency of the Global South on the Global North. We used these dependency shares as our main conceptual tool to run our analyses, as described below. This section elaborates on the various aspects of our methodology one by one. More details are provided an a supplementary online appendix.

## Input-Output Modeling

Input-output (I-O) modeling provides a framework for analyzing the interconnected flows of goods and services within and between economies. This makes it particularly valuable for examining trade dependencies and their broader socio-economic implications. I-O tables are typically compiled by national statistical agencies using data from business surveys, administrative records, and national accounts, organized into standardized sector classifications. Using these tables, I-O analysis captures how different sectors of an economy rely on inputs from other sectors to produce their outputs by representing the economy as a matrix where each cell shows the monetary value of transactions between sectors. This systematic accounting reveals both direct inter‑industry relationships (e.g., sector A uses inputs directly from sector B) and sales to final demand (households, government, exports), as well as indirect relationships that arise when intermediate goods and services are supplied via multiple rounds of production. When the underlying table includes different countries or regions (and it is, therefore, called a *multi-regional* I-O table), I-O models can trace how domestic production depends on foreign inputs and how domestic outputs serve foreign markets. We use global multiregional I-O tables when we calculate dependency shares on regionally aggregate (North versus South) and disaggregated (to countries in the South) levels.

While I-O modeling offers several analytical advantages for modelling immediate and short-term transition effects, there are also limitations that need to be taken seriously when interpreting the results of such models. These limitations arise directly from the core assumptions one must be willing to make to use such models. For example, I-O models assume constant returns to scale, fixed proportions in the use of factors of production (i.e. there is no adaptation to changes in factor prices, in contrast to what is assumed in neoclassical production functions), no technical change that changes productive efficiency, and a short‑run price elasticity of final demand of zero (i.e., within the model there are no immediate effects of price changes on the quantity demanded). Therefore, I-O modelling is limited in projecting dynamic effects over longer time periods, in which economies would undergo structural transformations in response to e.g. demand shocks. However, when carefully interpreted, I-O models are well suited to investigate contemporary trade relations and how, given these relations, any sort of transition in one region or sector can have immediate ripple effects in other regions or sectors and economies, if no further policy measures were undertaken. Therefore, this quantitative approach complements qualitative analyses of power relations and structural dependencies in global trade, providing empirical grounding for theoretical arguments about economic vulnerability, unequal exchange, and the geography of production networks. For more technical details on input-output methodology, the reader may consult the supplementary appendix.

## Data source

As our data source, we use the global MRIO (multi-regional Input Output) model EORA26, which is a simplified model of the full Eora MRIO. Eora26 reduces the full table to a matrix containing only 26 sectors (from 15,909 sectors in the full table), covering 190 countries. Using the version with the simpler, harmonised classification is preferable for our analysis as we do not disaggregate our result to the sectoral level but rather conduct more detailed analyses on various regional levels.

We use the table of the year 2017, the most recently publicly available data with a free academic license. For future research, an extension of our analysis using more recent data (with the most recent data available for purchase for the year 2022) would be desirable. For now, the use of the 2017 table allows us, on the one hand, to ensure public replicability of our results, and on the other hand, to capture the state of trade relations in pre-pandemic times that is not affected by pandemic-related (and thus exceptional) supply chain disruptions. Moreover, in appendix D we show the temporal robustness of trade dependencies between 2008 and 2015.

## North-South classification

We conduct our analyses both on a regionally aggregated and disaggregated level. For the aggregated analyses, we categorise the 190 countries available in EORA26 as either 'Global North' or 'Global South'. To keep things simple and transparent we follow the common strategy of other studies on unequal ecological exchange, such as Dorninger et al. [-@dorninger2021], who start with the different income groups provided by the World Bank, and then adjust the grouping for population sizes. 
@tbl-group-descriptives provides key demographic and environmental indicators for the two groups (a full list of countries is provided in the appendix). 
The Global North comprises 
`{python} len(north_codes)` 
countries with a combined population of 
`{python} format_millions(population_north_final)` 
people, representing 
`{python} format_percentage((population_north_final / (population_north_final + population_south_final)) * 100, 1)` 
of the global population covered in our analysis. The Global South includes `{python} len(south_codes)` countries with 
`{python} format_millions(population_south_final)`
inhabitants, accounting for 
`{python} format_percentage((population_south_final / (population_north_final + population_south_final)) * 100, 1)` 
of the world population.

```{python}
#| label: tbl-group-descriptives
#| tbl-cap: "Descriptive Statistics by Country Group (2017)"
#| echo: false

# Load the emissions data
stressor_data = pd.read_csv(here("data", "tidy", "emissions_table.csv"))

# Get population data for each group
population_data_path = here("data", "tidy", "population_data.csv")
population_data = pd.read_csv(population_data_path)
north_pop_data = population_data[population_data['country'].isin(north_codes)]
south_pop_data = population_data[population_data['country'].isin(south_codes)]

population_overview_path = here("data", "tidy", "population_overview.csv")
population_overview = pd.read_csv(population_overview_path)

pop_north = population_overview.loc[population_overview["region"] == "GlobalNorth", "Population"]
pop_south = population_overview.loc[population_overview["region"] == "GlobalSouth", "Population"]
pop_china_india = population_overview.loc[population_overview["region"] == "ChinaIndia", "Population"]
        
population_north_final = int(pop_north.iloc[0]) if len(pop_north) > 0 else 0
population_south_final = int(pop_south.iloc[0]) if len(pop_south) > 0 else 0
population_china_india_final = int(pop_china_india.iloc[0]) if len(pop_china_india) > 0 else 0  

# Extract values from stressor_data
north_emissions = stressor_data.loc[stressor_data['Region'] == 'Global North', 'Emissions (Mt)'].iloc[0]
south_emissions = stressor_data.loc[stressor_data['Region'] == 'Global South', 'Emissions (Mt)'].iloc[0]
north_materials = stressor_data.loc[stressor_data['Region'] == 'Global North', 'Materials (M)'].iloc[0]
south_materials = stressor_data.loc[stressor_data['Region'] == 'Global South', 'Materials (M)'].iloc[0]
north_per_cap_emissions = stressor_data.loc[stressor_data['Region'] == 'Global North', 'Per Cap Em.'].iloc[0]
south_per_cap_emissions = stressor_data.loc[stressor_data['Region'] == 'Global South', 'Per Cap Em.'].iloc[0]
north_per_cap_materials = stressor_data.loc[stressor_data['Region'] == 'Global North', 'Per Cap Mat.'].iloc[0]
south_per_cap_materials = stressor_data.loc[stressor_data['Region'] == 'Global South', 'Per Cap Mat.'].iloc[0]

# Calculate basic descriptives
descriptive_stats = {
   'Indicator': [
       'Number of countries',
       'Total population (millions)',
       'Average population per country (millions)',
       'Median population per country (millions)',
       'Share of global population (%)',
       'Total GHG emissions (Mt CO₂-eq)',
       'Per capita emissions (t CO₂-eq/person)',
       'Total raw material inputs (millions)',
       'Per capita material inputs'
   ],
   'Global North': [
       len(north_codes),
       f"{population_north_final / 1_000_000:.1f}",
       f"{north_pop_data['population'].mean() / 1_000_000:.1f}",
       f"{north_pop_data['population'].median() / 1_000_000:.1f}",
       f"{(population_north_final / (population_north_final + population_south_final)) * 100:.1f}",
       f"{north_emissions:.1f}",
       f"{north_per_cap_emissions:.3f}",
       f"{north_materials:.1f}",
       f"{north_per_cap_materials:.2f}"
   ],
   'Global South': [
       len(south_codes),
       f"{population_south_final / 1_000_000:.1f}",
       f"{south_pop_data['population'].mean() / 1_000_000:.1f}",
       f"{south_pop_data['population'].median() / 1_000_000:.1f}",
       f"{(population_south_final / (population_north_final + population_south_final)) * 100:.1f}",
       f"{south_emissions:.1f}",
       f"{south_per_cap_emissions:.3f}",
       f"{south_materials:.1f}",
       f"{south_per_cap_materials:.2f}"
   ]
}

descriptive_table = pd.DataFrame(descriptive_stats)
descriptive_table
```

Note that we exclude China and India from our analysis due to their unique economic characteristics and substantial influence that, on the one hand, makes it ambivalent to classify them, and on the other hand, would make it difficult to capture the experience of those less prominent Global South countries which, we assume, most scholars have in mind when they call out the potentially adverse effects of Northern Degrowth on Global South economies. 

Note also that there is no general consensus on North-South classifications, and the use of these categories is itself contested [@haug2021; @sud2022]]. The reason we are using this framing initially is that we thereby connect directly to Degrowth debates on the question of 'Degrowth and the Global South'. Moreover, for the intended meaning of the question what happens to 'the South' if 'the North' degrows, our classification along income brackets seems fairly reasonable. Our 'North' category includes most of those countries of which it is said that Degrowth is a concept by and for them, such as most (but not all) European countries, the United States, and Japan. Nonetheless, recognising the limits of such an aggregate analysis, we also add a disaggregated perspective that quantifies in greater detail the shape and size of the architecture of dependency of those countries not classified as high-income countries across various regions, such as Latin America, Sub-Saharan Africa, or Asia.

## Dependency shares

Our main analytical tool is that of dependency shares. They capture what amount of value added in the form of, for example, employee compensation or business profits, in a given region can be attributed to -- and thus depends on -- trade with the cluster of high-income countries, i.e. the Global North. In other words, they measure the share of value added that emerges in the Global South because of activties associated with exports to the Global North.

In this context, we distinguish between dependency on final demand and total trade dependency.
Final demand dependency takes into account exports of goods and services that are directly consumed in the Global North, whereby total trade dependency also includes the export of intermediate goods and services, products and services that are used in further production processes in the North. After having thereby quantified the total trade dependency of the Global South on the Global North in terms of its effect on various value added categories, we then provide the regionally disaggregated analysis that calculates the dependency share for each country on trade with the Global North, showing the result by continent as well as by dependency cluster (ranging from countries that experience only weak or no dependency, to those who see a significant share of their country's total value added coming from trade with the North). 

Lastly, we look at the main determinants of trade dependency using a linear regression model, testing for trade openness, country size, wealth and natural resources. The main motivation for this analysis was to test whether there are some clear patterns of dependency, such as 'smaller countries are more dependent' or 'richer countries are less dependent'. As we will explain below, the model clearly shows that such simple relationship do *not* explain the heterogeneity in trade dependency.

 Aside from our concrete results, which will follow in the next section, we see one contribution of this paper in its methodological suggestion -- namely to use dependency shares, calculated through multi-regional input-output tables, as a core analytical tool to contribute to the questions around structural dependencies in the context of the debate of 'Degrowth and the Global South'. Here our paper differs from related contributions, such as Fevereiro and Lowe [-@fevereiro2025], who use projections over several years instead of dependency shares.

```{python}
def calculate_consumption_driven_dependency(
    eora_mario, primary_input_label, 
    from_regions, to_regions, population_to=None):
    """
    Calculate consumption-driven dependency: how much value added in to_regions depends on 
    final demand (consumption) from from_regions.
    
    This captures only direct effects through final demand purchases, not intermediate trade.
    
    Parameters:
    -----------
    eora_mario : mario.Database
        Parsed EORA database object with calculated matrices
    primary_input_label : str
        The primary input category to analyze. Options:
        - 'Primary input, Compensation of employees D.1' (employee wages/salaries)
        - 'Primary input, Net mixed income B.3n' (self-employment, informal sector)
        - 'Primary input, Net operating surplus B.2n' (business profits)
    from_regions : set or list
        ISO3 country codes representing demand origin (e.g., Global North)
    to_regions : set or list
        ISO3 country codes representing supply regions (e.g., Global South)
    population_to : int, optional
        Population of to_regions for per capita calculations
        
    Returns:
    --------
    dict
        Dictionary containing:
        - 'value_added_amount': Total value added in to_regions dependent on from_regions final demand
        - 'total_value_added': Total value added of this type in to_regions
        - 'dependency_share': Percentage of total value added at risk
        - 'per_capita': Per capita dependency (if population provided)
        - 'primary_input': Name of the primary input analyzed
    """
    
    # Extract the readable name of the primary input
    primary_input_name = primary_input_label.split(',')[1].strip() if ',' in primary_input_label else primary_input_label
    
    # Get indices for all to_regions sectors (regions × sectors)
    to_region_idx = [idx for idx in eora_mario.Z.index if idx[0] in to_regions]
    
    # Get column indices for from_regions final demand categories
    # This captures all final demand columns (household, government, investment, etc.)
    from_region_fd_cols = [col for col in eora_mario.Y.columns if col[0] in from_regions]
    
    # Extract from_regions final demand for to_regions products
    # Sum across all final demand categories to get total final demand
    # for each to_regions sector (results in a vector with to_regions sectors as index)
    final_demand_vector = eora_mario.Y.loc[to_region_idx, from_region_fd_cols].sum(axis=1)
    
    # Get the to_regions domestic Leontief inverse matrix
    # This captures how to_regions sectors supply each other to fulfill external demand
    # Shows the total (direct + indirect) production requirements within to_regions
    L_to_regions = eora_mario.w.loc[to_region_idx, to_region_idx]
    
    # Extract value-added coefficients for the chosen primary input
    v_all = eora_mario.v.loc[primary_input_label]
    
    # Filter to get only to_regions value-added coefficients
    # Shows how much of this primary input is generated per unit of output in each to_regions sector
    v_to_regions = v_all[to_region_idx]
    
    # Calculate total value added generated in to_regions for from_regions final demand
    # Step 1: L_to_regions.dot(final_demand_vector) = total to_regions production needed (direct + indirect)
    # Step 2: v_to_regions.dot(...) = primary input generated from this production
    # This captures: from_regions final demand → to_regions production chains → to_regions value added
    value_added_amount = v_to_regions.dot(L_to_regions.dot(final_demand_vector))
    
    # Get total value added of this type in to_regions (for normalization)
    total_value_added = eora_mario.V.loc[primary_input_label, to_region_idx].sum()
    
    # Calculate dependency share
    dependency_share = (value_added_amount / total_value_added) * 100 if total_value_added > 0 else 0
    
    # Calculate per capita dependency if population provided
    per_capita = value_added_amount / population_to if population_to else None
    
    # Prepare results dictionary
    results = {
        'value_added_amount': value_added_amount, # Old: va_gs_to_gn
        'total_value_added': total_value_added, # Old: total_value_added
        'dependency_share': dependency_share,
        'primary_input': primary_input_name,
        'dependency_type': 'Consumption-driven (Final Demand)',
        'from_regions_count': len(from_regions),
        'to_regions_count': len(to_regions)
    }
    
    if per_capita is not None:
        results['per_capita'] = per_capita
        
    return results
```

```{python}
def calculate_total_trade_dependency(
    eora_mario, primary_input_label, from_regions, 
    to_regions, population_to=None):
    """
    Calculate total trade dependency: how much value added in to_regions depends on 
    ALL demand from from_regions (both final demand AND intermediate purchases).
    
    This captures the complete trade relationship including supply chain linkages.
    
    Parameters:
    -----------
    eora_mario : mario.Database
        Parsed EORA database object with calculated matrices
    primary_input_label : str
        The primary input category to analyze. Options:
        - 'Primary input, Compensation of employees D.1' (employee wages/salaries)
        - 'Primary input, Net mixed income B.3n' (self-employment, informal sector)
        - 'Primary input, Net operating surplus B.2n' (business profits)
    from_regions : set or list
        ISO3 country codes representing demand origin (e.g., Global North)
    to_regions : set or list
        ISO3 country codes representing supply regions (e.g., Global South)
    population_to : int, optional
        Population of to_regions for per capita calculations
        
    Returns:
    --------
    dict
        Dictionary containing:
        - 'value_added_amount': Total value added in to_regions dependent on ALL from_regions demand
        - 'total_value_added': Total value added of this type in to_regions  
        - 'dependency_share': Percentage of total value added at risk
        - 'per_capita': Per capita dependency (if population provided)
        - 'final_demand_component': Value added from final demand only
        - 'intermediate_component': Value added from intermediate trade only
        - 'intermediate_share': Percentage of dependency from intermediate trade
        - 'multiplier_effect': Ratio of total to final demand dependency
        - 'primary_input': Name of the primary input analyzed
    """
    
    # Extract the readable name of the primary input
    primary_input_name = primary_input_label.split(',')[1].strip() if ',' in primary_input_label else primary_input_label
    
    # Get indices for all to_regions sectors (regions × sectors)
    to_region_idx = [idx for idx in eora_mario.Z.index if idx[0] in to_regions]
    
    # Get column indices for from_regions final demand categories (Y matrix)
    from_region_fd_cols = [col for col in eora_mario.Y.columns if col[0] in from_regions]
    
    # Get column indices for from_regions intermediate demand (Z matrix)
    # This captures all intermediate demand from from_regions sectors buying to_regions inputs
    from_region_intermediate_cols = [col for col in eora_mario.Z.columns if col[0] in from_regions]
    
    # Extract from_regions FINAL demand for to_regions products
    final_demand_vector = eora_mario.Y.loc[to_region_idx, from_region_fd_cols].sum(axis=1)
    
    # Extract from_regions INTERMEDIATE demand for to_regions products
    # This sums across all from_regions sectors to get total intermediate purchases
    # of to_regions products for use in from_regions production processes
    intermediate_demand_vector = eora_mario.Z.loc[to_region_idx, from_region_intermediate_cols].sum(axis=1)
    
    # Combine final and intermediate demand to get TOTAL demand
    # This represents all from_regions purchases of to_regions products, whether for:
    # - Final consumption (households, government, investment)
    # - Intermediate production (inputs for from_regions manufacturing/services)
    total_demand_vector = final_demand_vector + intermediate_demand_vector
    
    # Get the to_regions domestic Leontief inverse matrix
    # This captures how to_regions sectors supply each other to fulfill external demand
    L_to_regions = eora_mario.w.loc[to_region_idx, to_region_idx]
    
    # Extract value-added coefficients for the chosen primary input
    v_all = eora_mario.v.loc[primary_input_label]
    v_to_regions = v_all[to_region_idx]
    
    # Calculate value added components
    # Final demand component (for comparison)
    final_component = v_to_regions.dot(L_to_regions.dot(final_demand_vector))
    
    # Total trade dependency (final + intermediate)
    total_value_added_amount = v_to_regions.dot(L_to_regions.dot(total_demand_vector))
    
    # Intermediate component (derived)
    intermediate_component = total_value_added_amount - final_component
    
    # Get total value added of this type in to_regions (for normalization)
    total_value_added = eora_mario.V.loc[primary_input_label, to_region_idx].sum()
    
    # Calculate shares and ratios
    dependency_share = (total_value_added_amount / total_value_added) * 100 if total_value_added > 0 else 0
    intermediate_share = (intermediate_component / total_value_added_amount) * 100 if total_value_added_amount > 0 else 0
    multiplier_effect = total_value_added_amount / final_component if final_component > 0 else 0
    
    # Calculate per capita dependency if population provided
    per_capita = total_value_added_amount / population_to if population_to else None
    
    # Prepare results dictionary
    results = {
        'value_added_amount': total_value_added_amount,
        'total_value_added': total_value_added,
        'dependency_share': dependency_share,
        'final_demand_component': final_component,
        'intermediate_component': intermediate_component,
        'intermediate_share': intermediate_share,
        'multiplier_effect': multiplier_effect,
        'primary_input': primary_input_name,
        'dependency_type': 'Total Trade (Final + Intermediate)',
        'from_regions_count': len(from_regions),
        'to_regions_count': len(to_regions)
    }
    
    if per_capita is not None:
        results['per_capita'] = per_capita
        
    return results
```


# Results {#sec-results}

## Export dependency at the aggregate level

In the following we compute the export dependency for three different kinds of so called primary inputs to production^[
    Primary inputs to production are inputs that are not supplied by other sectors, but by actors that are outside the inter-industry relationships. These actors are usually the government, households and other countries.
    ] 
in the Global South, which are all relevant to capture different aspects of socio-economic provisioning: employee compensation, net mixed income, and net operating surplus.^[
    The definitions of these categories are taken directly from the 2008 *System of National Accounts* [@sna08], i.e. the global accounting framework for any macroeconomic indicator.
]

### Employee compensation

```{python}
consumption_results_ce = calculate_consumption_driven_dependency(
    eora_mario, 
    'Primary input, Compensation of employees D.1',
    north_codes, 
    south_codes, 
    population_south_final
)
```   

```{python}
total_trade_results_ce = calculate_total_trade_dependency(
    eora_mario,
    'Primary input, Compensation of employees D.1', 
    north_codes,
    south_codes,
    population_south_final
)

total_gs_va_ce = total_trade_results_ce["total_value_added"]
va_gs_to_gn_total_ce = total_trade_results_ce["value_added_amount"]
dependency_share_total_ce = total_trade_results_ce["dependency_share"]
dependency_ratio_total_ce = 1 / (total_trade_results_ce["dependency_share"] / 100)
```

Employee compensation is defined as the total remuneration provided by enterprises to workers in exchange for their labor. It encompasses both monetary wages and salaries as well as non-monetary benefits and employer-paid social contributions. In the System of National Accounts, the term encompasses not only direct cash payments but also payments in kind, social security contributions, and other employment-related social insurance schemes funded by employers [for technical details see p. 139ff in United Nations -@sna08]. 

In the context of Global South economies, employee compensation serves as a crucial indicator of formal sector employment vulnerability, as it captures the direct income flows to workers. It is imperative to comprehend the interrelation between trade and the compensation of employees, particularly in the context of lower-income economies. A decline in Global North demand that threatens this compensation category would therefore have ramifications for both individual workers' immediate purchasing power and their long-term economic security on commodity markets, as well as access to employment-related benefits.

We start by computing *consumption-driven dependency* of employee compensation, i.e. how much Global South employee compensation depends on Global North households, governments, and businesses purchasing final goods and services. While this includes indirect effects through Global South supply chains (via Leontief inverse) it does *not* include Global South inputs sold to Global North production processes.

Concretely, the total amount of employee compensation in the South that is dependent on exports to the North is
`{python} format_currency_millions(consumption_results_ce["value_added_amount"])`, which amounts to 
`{python} format_percentage(consumption_results_ce["dependency_share"], 3)`
of total employee compensation in the South. 
On the one hand, this result might overestimate the effect, since input-output calculations do not take into account mitigation and adaptation effects: Employees might switch their job towards companies that are less dependent from export business, or the goods and services might be sold to other countries in the South itself. Whether such adaptation measures can actually occur, and how long they take is, however, unclear, which is why the above result is likely to be relevant at least in the short term. On the other hand, however, this result underestimates the *total* risk for the South as many exports do not go to final consumption in the North, but are used as further inputs to production by Northern firms.

Taking into account this export of intermediate goods, 
the amount of employee compensation that is realized because of exports from the South to the North adds up to 
`{python} format_currency_millions(total_trade_results_ce["value_added_amount"])`, 
which amounts to 
`{python} format_percentage( total_trade_results_ce["dependency_share"], 3)` 
of total employee compensation in the South.
This means that roughly 1 in 
`{python} format_number(dependency_ratio_total_ce)` 
dollars of formal employment compensation in the Global South is tied to Northern economic activity.
Notably, exports of intermediate products make up 
`{python} format_percentage( total_trade_results_ce["intermediate_share"], 1)` 
of total trade dependencies when it comes to employee compensation, and are thus a much larger factor in considering trade dependencies for employee compensation. We now turn to the next primary input of interest, net mixed income.

### Net mixed income

```{python}
consumption_results_nmi = calculate_consumption_driven_dependency(
    eora_mario, 
    'Primary input, Net mixed income B.3n',
    north_codes, 
    south_codes, 
    population_south_final
)

va_gs_to_gn_mixed_inc = consumption_results_nmi["value_added_amount"]
total_gs_va_mixed_inc = consumption_results_nmi["total_value_added"]
dependency_share_mixed_inc = consumption_results_nmi["dependency_share"]
```

```{python}
total_trade_results_nmi = calculate_total_trade_dependency(
    eora_mario,
    'Primary input, Net mixed income B.3n', 
    north_codes,
    south_codes,
    population_south_final
)
dependency_ratio_total_nmi = 1 / (total_trade_results_nmi["dependency_share"] / 100)
```

Net mixed income is defined as the sum of income generated by unincorporated enterprises owned by households, encompassing both labor and capital components. It signifies the earnings of individuals who are unable to distinctly differentiate between their returns to labor and their returns to capital ownership [@sna08, para. 7.9]. This category primarily encompasses income from self-employment, small-scale farming, informal enterprises, and micro-businesses where owners provide both their labor and use their own capital assets.

This kind of income is particularly salient in the South, where a significant portion of the workforce operate outside formal employment structures, engaging in subsistence agriculture, street vending, artisanal production, and small-scale service provision as their respective earnings are usually accounted as mixed income. Therefore, quantifying the trade dependency of mixed income is crucial for assessing the vulnerability of these economic actors, that are often marginalized in the global economy. 

The results show that mixed income exhibits remarkably similar vulnerability to employee compensation regarding Global North final demand. Specifically, 
`{python} format_currency_millions(va_gs_to_gn_mixed_inc)`
of Global South mixed income -- representing 
`{python} format_percentage(dependency_share_mixed_inc, 3)`
of the total -- depends on Global North household, government, and business consumption. This dependency level closely mirrors that observed for employee compensation 
(`{python} format_percentage(consumption_results_ce["dependency_share"], 3)`), 
suggesting that informal workers, small farmers, and micro-entrepreneurs face comparable dependency to Global North consumption patterns as formal employees.

When we extend the analysis to include goods and services supplied to Northern production processes, the dependend amount of mixed income increases substantially to
`{python} format_currency_millions(total_trade_results_nmi["value_added_amount"])`,
representing 
`{python} format_percentage(total_trade_results_nmi["dependency_share"], 3)`
of total Global South mixed income. 
This finding indicates that approximately 1 in
`{python} format_number(dependency_ratio_total_nmi)` 
dollars
of mixed income in the South is tied to Northern economic activity. Consistent with our findings for employee compensation, intermediate trade relationships dominate the dependency structure, accounting for 
`{python} format_percentage( total_trade_results_nmi["intermediate_share"], 1)` 
of total trade linkages, indicating that changes in Northern final consumption generate amplified impacts through supply chain networks.

### Net operating surplus

```{python}
consumption_results_nos = calculate_consumption_driven_dependency(
    eora_mario, 
    'Primary input, Net operating surplus B.2n',
    north_codes, 
    south_codes, 
    population_south_final
)
```

```{python}
total_trade_results_nos = calculate_total_trade_dependency(
    eora_mario,
    'Primary input, Net operating surplus B.2n',
    north_codes,
    south_codes,
    population_south_final
)
dependency_ratio_total_nos = 1 / (total_trade_results_nos["dependency_share"] / 100)
```

Net operating surplus is defined as the operating surplus generated by corporations and quasi-corporations after the deduction of employee compensation and the consumption of fixed capital from their gross value added [@sna08, para. 7.8-7.12]. In contrast to net mixed income, which captures the blended labor and capital returns of unincorporated household enterprises, net operating surplus specifically measures the returns to capital in formal corporate structures where the distinction between labor compensation and capital returns can be distinguished clearly. Thereby, this category comprises business profits, dividends, retained earnings, and other forms of property income accruing to corporate entities. 


For our analysis of Southern dependencies, it complements the previous two measures by explicating the vulnerability of the formal business sector returns and investment incentives. While net mixed income captures the precarious livelihoods of informal sector participants, net operating surplus reflects the exposure of established businesses and capital formation processes.

The total amount of net operating surplus being dependent on exports to the final demand in the North sums up to
`{python} format_currency_millions(consumption_results_nos["value_added_amount"])`
--
`{python} format_percentage(consumption_results_nos["dependency_share"], 3)`
of total net operating surplus in the South. Taking into account intermediate goods increases the dependency of net operating surplus to
`{python} format_currency_millions(total_trade_results_nos["value_added_amount"])`
(`{python} format_percentage(total_trade_results_nos["dependency_share"], 3)`
of total Global South net operating surplus). 
In other words: 1 in
`{python} format_number(dependency_ratio_total_nos)` 
dollars
of net operating surplus in the South is dependent on exports to the North. 
As in the previous cases, intermediate trade relationships dominate the dependency structure, accounting for 
`{python} format_percentage(total_trade_results_nos["intermediate_share"], 1)` 
of total trade dependency, highlighting again the crucial role of supply chain network integration.


```{python}
# Export data for R ggplot2 visualization
# Add this code block after your dependency calculations

# Collect all the dependency results we calculated
def export_dependency_data_for_r(  
  consumption_results_ce,
  total_trade_results_ce,
  consumption_results_nmi,
  total_trade_results_nmi,
  consumption_results_nos,
  total_trade_results_nos):
    """Export dependency analysis data for R ggplot2 visualization"""
    
    # Create data for bar chart 1: Dependency shares (percentages)
    dependency_shares_data = {
        'category': ['Employee Compensation', 'Net Mixed Income', 'Net Operating Surplus'] * 2,
        'dependency_type': ['Final Demand'] * 3 + ['Total Trade'] * 3,
        'percentage': [
            consumption_results_ce['dependency_share'],
            consumption_results_nmi['dependency_share'], 
            consumption_results_nos['dependency_share'],
            total_trade_results_ce['dependency_share'],
            total_trade_results_nmi['dependency_share'],
            total_trade_results_nos['dependency_share']
        ]
    }
    
    # Create data for bar chart 2: Absolute amounts ($ millions)
    dependency_amounts_data = {
        'category': ['Employee Compensation', 'Net Mixed Income', 'Net Operating Surplus'] * 2,
        'dependency_type': ['Final Demand'] * 3 + ['Total Trade'] * 3,
        'amount_millions': [
            consumption_results_ce['value_added_amount'] / 1e6,
            consumption_results_nmi['value_added_amount'] / 1e6,
            consumption_results_nos['value_added_amount'] / 1e6,
            total_trade_results_ce['value_added_amount'] / 1e6,
            total_trade_results_nmi['value_added_amount'] / 1e6,
            total_trade_results_nos['value_added_amount'] / 1e6
        ]
    }
    
    # Create data for stacked bar chart: Final vs Intermediate breakdown
    stacked_data = {
        'category': ['Employee Compensation', 'Net Mixed Income', 'Net Operating Surplus'],
        'final_demand_millions': [
            consumption_results_ce['value_added_amount'] / 1e6,
            consumption_results_nmi['value_added_amount'] / 1e6,
            consumption_results_nos['value_added_amount'] / 1e6
        ],
        'intermediate_trade_millions': [
            total_trade_results_ce['intermediate_component'] / 1e6,
            total_trade_results_nmi['intermediate_component'] / 1e6,
            total_trade_results_nos['intermediate_component'] / 1e6
        ],
        'total_trade_millions': [
            total_trade_results_ce['value_added_amount'] / 1e6,
            total_trade_results_nmi['value_added_amount'] / 1e6,
            total_trade_results_nos['value_added_amount'] / 1e6
        ],
        'intermediate_share': [
            total_trade_results_ce['intermediate_share'],
            total_trade_results_nmi['intermediate_share'],
            total_trade_results_nos['intermediate_share']
        ],
        'multiplier_effect': [
            total_trade_results_ce['multiplier_effect'],
            total_trade_results_nmi['multiplier_effect'],
            total_trade_results_nos['multiplier_effect']
        ]
    }
    
    # Additional summary statistics for text/annotations
    summary_stats = {
        'total_dependency_millions': (
            total_trade_results_ce['value_added_amount'] + 
            total_trade_results_nmi['value_added_amount'] + 
            total_trade_results_nos['value_added_amount']
        ) / 1e6,
        'total_final_demand_millions': (
            consumption_results_ce['value_added_amount'] + 
            consumption_results_nmi['value_added_amount'] + 
            consumption_results_nos['value_added_amount']
        ) / 1e6,
        'average_intermediate_share': (
            total_trade_results_ce['intermediate_share'] + 
            total_trade_results_nmi['intermediate_share'] + 
            total_trade_results_nos['intermediate_share']
        ) / 3,
        'global_south_population': population_south_final,
        'per_capita_dependency': (
            total_trade_results_ce['value_added_amount'] + 
            total_trade_results_nmi['value_added_amount'] + 
            total_trade_results_nos['value_added_amount']
        ) / population_south_final
    }
    
    # Convert to DataFrames
    df_shares = pd.DataFrame(dependency_shares_data)
    df_amounts = pd.DataFrame(dependency_amounts_data)
    df_stacked = pd.DataFrame(stacked_data)
    
    # Save as CSV files for R
    df_shares.to_csv(here("data", "tidy", "dependency_shares.csv"), index=False)
    df_amounts.to_csv(here("data", "tidy", "dependency_amounts.csv"), index=False)
    df_stacked.to_csv(here("data", "tidy", "dependency_stacked.csv"), index=False)
    
    # Save summary stats as JSON
    with open(here("data", "tidy", "dependency_summary_stats.json"), 'w') as f:
        json.dump(summary_stats, f, indent=2)
    
    # Also create a long format version for easier ggplot2 manipulation
    # Reshape stacked data to long format
    df_long = pd.melt(df_stacked, 
                      id_vars=['category', 'intermediate_share', 'multiplier_effect'],
                      value_vars=['final_demand_millions', 'intermediate_trade_millions'],
                      var_name='component_type', 
                      value_name='amount_millions')
    
    # Clean up component type labels
    df_long['component_type'] = df_long['component_type'].map({
        'final_demand_millions': 'Final Demand',
        'intermediate_trade_millions': 'Intermediate Trade'
    })
    
    df_long.to_csv(here("data", "tidy", "dependency_long_format.csv"), index=False)
    
    return df_shares, df_amounts, df_stacked, df_long, summary_stats

# Run the export
df_shares, df_amounts, df_stacked, df_long, summary_stats = export_dependency_data_for_r(
  consumption_results_ce,
  total_trade_results_ce,
  consumption_results_nmi,
  total_trade_results_nmi,
  consumption_results_nos,
  total_trade_results_nos
)
```

### Taking stock

@fig-trade-dependencies and @tbl-trade-dependency synthesize our findings on Global South trade dependencies across all three primary input categories. Several patterns emerge from the analysis so far.
First, the consumption-driven dependencies demonstrate remarkable consistency across all primary inputs, ranging narrowly from 
`{python} format_percentage(consumption_results_nmi['dependency_share'], 2)` 
to 
`{python} format_percentage(consumption_results_nos['dependency_share'], 2)`. 
This indicates that Global North final demand directly accounts for approximately 
`{python} format_percentage((consumption_results_ce['dependency_share'] + consumption_results_nmi['dependency_share'] + consumption_results_nos['dependency_share'])/3, 1)` 
of all forms of value added in the Global South, irrespective of whether we examine formal wages, informal sector income, or business profits. The uniformity of this relationship is particularly noteworthy given the heterogeneous economic characteristics of these income categories.

```{python}
# Execute the R script to generate the figure

try:
    subprocess.run(
        ["Rscript", "R/DependencyFigures.R"], 
        check=True,
        cwd=str(here())  # Use your here() function!
    )
    # print("✅ Trade dependency figure generated")
except subprocess.CalledProcessError as e:
    print(f"❌ Error: {e}")
    raise
```

![Global South Trade Dependencies on Global North Demand by Primary Input Category](../output/DependencySharesAggregate.png){#fig-trade-dependencies}


Second, intermediate trade constitutes the predominant component of the dependency structure across all categories. As @tbl-trade-dependency demonstrates, between 
`{python} format_percentage(total_trade_results_ce['intermediate_share'], 1)` 
and 
`{python} format_percentage(total_trade_results_nos['intermediate_share'], 1)` 
of total trade dependencies originate from Southern provision of intermediate inputs to Northern production processes rather than from direct sales to Northern final consumers. Consequently, supply chain linkages generate multiplier effects ranging from 
`{python} format_number(total_trade_results_ce['multiplier_effect'], decimals=1)`
for employee compensation to 
`{python} format_number(total_trade_results_nos['multiplier_effect'], decimals=1)`
for operating surplus. Stated alternatively, for every dollar of Global South value added directly attributable to Northern consumption, an additional `{python} format_currency(total_trade_results_ce['multiplier_effect']-1)` to `{python} format_currency(total_trade_results_nos['multiplier_effect']-1)` is generated through intermediate trade relationships.


```{python}
#| label: tbl-trade-dependency
#| tbl-cap: "Global South Value Added Dependencies on Global North Demand (2017). The multiplier effect in the table is computed as the ratio of total trade dependency and final demand dependency. It shows how supply chain linkages amplify the impact of changes in final demand."
#| echo: false

# Create the dependency summary table
def create_dependency_summary_table(
  consumption_results_ce,
  total_trade_results_ce,
  consumption_results_nmi,
  total_trade_results_nmi,
  consumption_results_nos,
  total_trade_results_nos
):
    """Create the dependency summary table from calculated results"""
    
    # Calculate totals
    total_final_demand = (consumption_results_ce['value_added_amount'] + 
                         consumption_results_nmi['value_added_amount'] + 
                         consumption_results_nos['value_added_amount'])
    
    total_trade_dependency = (total_trade_results_ce['value_added_amount'] + 
                             total_trade_results_nmi['value_added_amount'] + 
                             total_trade_results_nos['value_added_amount'])
    
    total_value_added = (total_trade_results_ce['total_value_added'] + 
                        total_trade_results_nmi['total_value_added'] + 
                        total_trade_results_nos['total_value_added'])
    
    total_intermediate = (total_trade_results_ce['intermediate_component'] + 
                         total_trade_results_nmi['intermediate_component'] + 
                         total_trade_results_nos['intermediate_component'])
    
    # Create table data with proper formatting - ALL MONETARY VALUES IN BILLIONS
    table_data = {
        'Primary Input Category': [
            'Employee Compensation', 
            'Net Mixed Income', 
            'Net Operating Surplus',
            'Total'
        ],
        'Total GS Value Added ($ billions)': [
            f"{total_trade_results_ce['total_value_added'] / 1e9:.2f}",
            f"{total_trade_results_nmi['total_value_added'] / 1e9:.2f}",
            f"{total_trade_results_nos['total_value_added'] / 1e9:.2f}",
            f"{total_value_added / 1e9:.2f}"
        ],
        'Final Demand Dependency ($ billions)': [
            f"{consumption_results_ce['value_added_amount'] / 1e9:.3f} ({consumption_results_ce['dependency_share']:.2f}%)",
            f"{consumption_results_nmi['value_added_amount'] / 1e9:.3f} ({consumption_results_nmi['dependency_share']:.2f}%)",
            f"{consumption_results_nos['value_added_amount'] / 1e9:.3f} ({consumption_results_nos['dependency_share']:.2f}%)",
            f"{total_final_demand / 1e9:.3f} ({(total_final_demand / total_value_added) * 100:.2f}%)"
        ],
        'Total Trade Dependency ($ billions)': [
            f"{total_trade_results_ce['value_added_amount'] / 1e9:.3f} ({total_trade_results_ce['dependency_share']:.2f}%)",
            f"{total_trade_results_nmi['value_added_amount'] / 1e9:.3f} ({total_trade_results_nmi['dependency_share']:.2f}%)",
            f"{total_trade_results_nos['value_added_amount'] / 1e9:.3f} ({total_trade_results_nos['dependency_share']:.2f}%)",
            f"{total_trade_dependency / 1e9:.3f} ({(total_trade_dependency / total_value_added) * 100:.2f}%)"
        ],
        'Intermediate Share (%)': [
            f"{total_trade_results_ce['intermediate_share']:.1f}",
            f"{total_trade_results_nmi['intermediate_share']:.1f}",
            f"{total_trade_results_nos['intermediate_share']:.1f}",
            f"{(total_intermediate / total_trade_dependency) * 100:.1f}"
        ],
        'Multiplier Effect': [
            f"{total_trade_results_ce['multiplier_effect']:.1f}×",
            f"{total_trade_results_nmi['multiplier_effect']:.1f}×",
            f"{total_trade_results_nos['multiplier_effect']:.1f}×",
            f"{total_trade_dependency / total_final_demand:.1f}×"
        ]
    }
    
    # Create DataFrame with proper index
    df = pd.DataFrame(table_data, index=[
        'Employee Compensation', 
        'Net Mixed Income', 
        'Net Operating Surplus',
        'Total'
    ])
    
    # Set index name to create the proper header
    df.index.name = 'Primary Input Category'
    
    return df, {
        'ce': (consumption_results_ce, total_trade_results_ce),
        'nmi': (consumption_results_nmi, total_trade_results_nmi),
        'nos': (consumption_results_nos, total_trade_results_nos)
    }

# Create and display the table
dependency_table, results_dict = create_dependency_summary_table(
  consumption_results_ce,
  total_trade_results_ce,
  consumption_results_nmi,
  total_trade_results_nmi,
  consumption_results_nos,
  total_trade_results_nos)

dependency_table
```


Third, the incorporation of intermediate trade linkages points to a certain hierarchy of vulnerability. As illustrated in @fig-trade-dependencies, net operating surplus exhibits the highest dependency at 
`{python} format_percentage(total_trade_results_nos['dependency_share'], 2)`, 
followed by net mixed income at 
`{python} format_percentage(total_trade_results_nmi['dependency_share'], 2)`, 
and employee compensation at 
`{python} format_percentage(total_trade_results_ce['dependency_share'], 2)`. 
This progression reflects the differential integration of income categories into global markets: while approximately one in `{python} format_number(round(1/(total_trade_results_ce['dependency_share']/100)))` dollars of wages depends on Northern demand, this ratio increases to one in `{python} format_number(round(1/(total_trade_results_nos['dependency_share']/100)))` dollars for business profits. This suggests that capital-intensive sectors in Global South economies exhibit greater structural dependence on Northern-centered value chains than their labor-intensive counterparts.

All in all, the aggregate statistics presented in @tbl-trade-dependency indicate that 
`{python} format_currency((total_trade_results_ce['value_added_amount'] + total_trade_results_nmi['value_added_amount'] + total_trade_results_nos['value_added_amount'])/1e9)` 
billions of Global South value added — representing 
`{python} format_percentage(((total_trade_results_ce['value_added_amount'] + total_trade_results_nmi['value_added_amount'] + total_trade_results_nos['value_added_amount'])/(total_trade_results_ce['total_value_added'] + total_trade_results_nmi['total_value_added'] + total_trade_results_nos['total_value_added']))*100, 2)` 
of the total value added in the South — depends on economic activity in the North. 
This dependency encompasses 
`{python} format_currency_millions((consumption_results_ce['value_added_amount'] + consumption_results_nmi['value_added_amount'] + consumption_results_nos['value_added_amount']))` 
directly linked to final consumption and an additional 
`{python} format_currency_millions(((total_trade_results_ce['value_added_amount'] + total_trade_results_nmi['value_added_amount'] + total_trade_results_nos['value_added_amount']) - (consumption_results_ce['value_added_amount'] + consumption_results_nmi['value_added_amount'] + consumption_results_nos['value_added_amount'])))` 
generated through production networks. 
While these aggregate results already provide some insights into the architecture of global economic interdependencies and the practical relevance of structural dependencies, they potentially obscure considerable heterogeneity across individual countries and regions within the South.
We address this shortcoming in the next section.


## Regional disaggregation

In the following, we consider the average dependency of each country with regard to the three primary inputs previously mentioned.^[Alternatives would have included a weighted average or the share of total value added. However, we decided to examine the simple average since it was deemed unadvisable to prioritize any of the categories to a disproportionate degree.]
@fig-regional-vulnerability and @tbl-dependency-groups provide an initial overview of the results.

```{python}
def calculate_country_dependencies(factor_label='Primary input, Compensation of employees D.1'):
    """
    Calculate dependency measures for each Global South country
    """
    
    factor_name = factor_label.split(',')[1].strip() if ',' in factor_label else factor_label
    
    # Get Global North final demand columns
    gn_fd_cols = [col for col in eora_mario.Y.columns if col[0] in north_codes]
    
    # Get Global North intermediate demand columns  
    gn_intermediate_cols = [col for col in eora_mario.Z.columns if col[0] in north_codes]
    
    country_results = []
    
    for country in south_codes:
        # Get indices for this specific country
        country_idx = [idx for idx in eora_mario.Z.index if idx[0] == country]
        
        if len(country_idx) == 0:
            continue  # Skip if country not in EORA data
            
        try:
            # Extract demands for this country's products
            y_country_to_gn = eora_mario.Y.loc[country_idx, gn_fd_cols].sum(axis=1)
            z_country_to_gn = eora_mario.Z.loc[country_idx, gn_intermediate_cols].sum(axis=1)
            
            # Get this country's domestic Leontief inverse (country × country)
            L_country = eora_mario.w.loc[country_idx, country_idx]
            
            # Get value-added coefficients for this country
            v = eora_mario.v.loc[factor_label]
            v_country = v[country_idx]
            
            # Calculate dependencies
            # Final demand dependency (consumption-driven)
            va_final = v_country.dot(L_country.dot(y_country_to_gn))
            
            # Intermediate demand dependency (production-driven)  
            va_intermediate = v_country.dot(L_country.dot(z_country_to_gn))
            
            # Total trade dependency
            va_total = va_final + va_intermediate
            
            # Get total value added for this country (for normalization)
            total_country_va = eora_mario.V.loc[factor_label, country_idx].sum()
            
            # Calculate dependency shares
            final_share = (va_final / total_country_va) * 100 if total_country_va > 0 else 0
            intermediate_share = (va_intermediate / total_country_va) * 100 if total_country_va > 0 else 0
            total_share = (va_total / total_country_va) * 100 if total_country_va > 0 else 0
            
            country_results.append({
                'country': country,
                'va_final_absolute': va_final,
                'va_intermediate_absolute': va_intermediate, 
                'va_total_absolute': va_total,
                'total_country_va': total_country_va,
                'final_dependency_share': final_share,
                'intermediate_dependency_share': intermediate_share,
                'total_dependency_share': total_share,
                'sectors_count': len(country_idx)
            })
            
        except Exception as e:
            print(f"Error processing {country}: {e}")
            continue
    
    df = pd.DataFrame(country_results)
    
    # Add population data using the correct column names
    pop_dict = dict(zip(population_data['country'], population_data['population']))
    df['population'] = df['country'].map(pop_dict)
    
    # Calculate per capita values (only for countries with population data)
    df['va_total_per_capita'] = df.apply(
        lambda row: row['va_total_absolute'] / row['population'] if pd.notna(row['population']) and row['population'] > 0 else np.nan, 
        axis=1
    )
    
    return df

# Now run the analysis
# print("Calculating country-level dependencies...")

factors = [
    ('Primary input, Compensation of employees D.1', 'Employee Compensation'),
    ('Primary input, Net mixed income B.3n', 'Net Mixed Income'),  
    ('Primary input, Net operating surplus B.2n', 'Net Operating Surplus')
]

all_results = {}

for factor_label, factor_name in factors:
    #print(f"Processing {factor_name}...")
    country_df = calculate_country_dependencies(factor_label)
    all_results[factor_name] = {'data': country_df, 'factor_label': factor_label}
    #print(f"  Processed {len(country_df)} countries")

#print("✅ Country-level analysis complete")
```

```{python}
def export_country_data_for_r(all_results):
    """Export country-level vulnerability data for R visualization"""
    
    # Load the mappings from JSON files
    with open(here("data", "tidy", "country_names.json"), 'r') as f:
        country_names = json.load(f)
    
    with open(here("data", "tidy", "regional_mapping.json"), 'r') as f:
        regional_mapping = json.load(f)
    
    # Get the data from each factor
    employee_data = all_results['Employee Compensation']['data']
    mixed_data = all_results['Net Mixed Income']['data'] 
    surplus_data = all_results['Net Operating Surplus']['data']
    
    # Merge all three datasets on country
    merged_data = employee_data[['country', 'total_dependency_share', 'va_total_absolute', 'va_total_per_capita']].copy()
    merged_data.columns = ['country', 'employee_comp_pct', 'employee_comp_absolute', 'employee_comp_per_capita']
    
    # Add mixed income data
    mixed_subset = mixed_data[['country', 'total_dependency_share', 'va_total_absolute', 'va_total_per_capita']].copy()
    mixed_subset.columns = ['country', 'mixed_income_pct', 'mixed_income_absolute', 'mixed_income_per_capita']
    merged_data = merged_data.merge(mixed_subset, on='country', how='outer')
    
    # Add operating surplus data
    surplus_subset = surplus_data[['country', 'total_dependency_share', 'va_total_absolute', 'va_total_per_capita']].copy()
    surplus_subset.columns = ['country', 'operating_surplus_pct', 'operating_surplus_absolute', 'operating_surplus_per_capita']
    merged_data = merged_data.merge(surplus_subset, on='country', how='outer')
    
    # Calculate averages and totals
    merged_data['avg_dependency_pct'] = merged_data[['employee_comp_pct', 'mixed_income_pct', 'operating_surplus_pct']].mean(axis=1)
    merged_data['total_absolute_millions'] = (
        merged_data['employee_comp_absolute'].fillna(0) + 
        merged_data['mixed_income_absolute'].fillna(0) + 
        merged_data['operating_surplus_absolute'].fillna(0)
    )
    merged_data['avg_per_capita_usd'] = merged_data[['employee_comp_per_capita', 'mixed_income_per_capita', 'operating_surplus_per_capita']].mean(axis=1)
    
    # Add country names and regions using loaded mappings
    merged_data['country_name'] = merged_data['country'].map(country_names)
    merged_data['country_name'] = merged_data['country_name'].fillna(merged_data['country'])
    merged_data['region'] = merged_data['country'].map(regional_mapping)
    merged_data['region'] = merged_data['region'].fillna('Other')
    
    # Convert absolute values to millions
    merged_data['total_absolute_millions'] = merged_data['total_absolute_millions'] / 1e6
    merged_data['employee_comp_millions'] = merged_data['employee_comp_absolute'] / 1e6
    merged_data['mixed_income_millions'] = merged_data['mixed_income_absolute'] / 1e6
    merged_data['operating_surplus_millions'] = merged_data['operating_surplus_absolute'] / 1e6
    
    # Select final columns for export
    r_export = merged_data[[
        'country', 'country_name', 'region',
        'avg_dependency_pct', 'total_absolute_millions', 'avg_per_capita_usd',
        'employee_comp_pct', 'mixed_income_pct', 'operating_surplus_pct',
        'employee_comp_millions', 'mixed_income_millions', 'operating_surplus_millions'
    ]].copy()
    
    # Sort by relative vulnerability
    r_export_sorted = r_export.sort_values('avg_dependency_pct', ascending=False)
    
    # Remove rows with all NaN dependencies
    r_export_sorted = r_export_sorted.dropna(subset=['avg_dependency_pct'])
    
    # Save for R
    r_export_sorted.to_csv(here("data", "tidy", "country_vulnerability.csv"), index=False)
    
    # Create regional summary
    regional_summary = r_export_sorted.groupby('region').agg({
        'country': 'count',
        'avg_dependency_pct': 'mean',
        'total_absolute_millions': 'sum',
        'avg_per_capita_usd': 'mean'
    }).round(2)
    
    regional_summary.columns = ['countries_count', 'avg_dependency_pct', 'total_absolute_millions', 'avg_per_capita_usd']
    regional_summary = regional_summary.reset_index()
    regional_summary.to_csv(here("data", "tidy", "regional_vulnerability.csv"), index=False)
    
    # print(f"✅ Exported data for {len(r_export_sorted)} countries and {len(regional_summary)} regions")
    return r_export_sorted, regional_summary

country_data_r, regional_data_r = export_country_data_for_r(all_results)
```

```{python}
# Execute R script to generate figures
try:
    subprocess.run(["Rscript", "R/CountryVulnerabilityFigures.R"], check=True, cwd=str(here()))
    # print("✅ Country vulnerability figures generated")
except subprocess.CalledProcessError as e:
    print(f"❌ Error: {e}")
```


![Global South Trade Dependencies for individual countries and regions](../output/CombinedVulnerabilityFigureFull.png){#fig-regional-vulnerability width=100%}


The initial observation is the remarkable heterogeneity of dependency shares, ranging from nearly zero (e.g., Somalia, Nepal, and Guyana) to over one-third (e.g., Ethiopia, Libya, and Hungary).
As demonstrated in panel B of @fig-regional-vulnerability and @tbl-dependency-groups, there are four different groups of countries: The majority of countries exhibit dependency levels ranging from 5% to 15%. However, a considerable number of countries demonstrates an average dependency level of 15-25%. Additionally, the data reveals two smaller groups of equally sized countries: one with low dependencies of 0-5% and another with very high dependencies of 25% or more. These findings suggest that dependencies exhibit significant heterogeneity across countries in the South.


```{python}
#| echo: false
#| output: false
# Execute R script to generate regression results
try:
    subprocess.run(
        ["Rscript", "R/CountryDependencyCorrelations.R"], 
        capture_output=True, check=True, cwd=str(here()))
    # print("✅ Country vulnerability figures generated")
except subprocess.CalledProcessError as e:
    print(f"❌ Error: {e}")
```

```{python}
#| label: tbl-dependency-groups
#| tbl-cap: "Countries Grouped by Dependency Levels"
#| hide-index: true

def create_dependency_groups(country_data_r):
    """Create dependency groups and format country lists"""
    # Define dependency thresholds
    def get_dependency_group(pct):
        if pct < 5:
            return "Weak dependency (<5%)"
        elif pct < 15:
            return "Moderate dependency (<15%)"
        elif pct < 25:
            return "Strong dependenc (<25%)"
        else:
            return "Very strong dependency (>25%)"
    
    # Add dependency group column
    country_data_r['dependency_group'] = country_data_r['avg_dependency_pct'].apply(get_dependency_group)
    
    # Group countries and format the country lists
    grouped_results = []
    
    for group in ["Weak dependency (<5%)", "Moderate dependency (<15%)", "Strong dependenc (<25%)", "Very strong dependency (>25%)"]:
        group_countries = country_data_r[country_data_r['dependency_group'] == group]
        
        if len(group_countries) > 0:
            # Format country names with percentages
            country_list = []
            for _, row in group_countries.iterrows():
                country_name = row['country_name']
                pct = row['avg_dependency_pct']
                country_list.append(f"{country_name} ({pct:.0f}%)")
                            # Join with commas
            formatted_countries = ", ".join(country_list)
            
            grouped_results.append({
                'Dependency Group': group,
                'Number of Countries': len(group_countries),
                'Countries': formatted_countries
            })
    
    return pd.DataFrame(grouped_results)

# Create the dependency groups table
pd.set_option('display.max_colwidth', None)
pd.set_option('display.width', None)
pd.set_option('display.max_columns', None)

dependency_groups_table = create_dependency_groups(country_data_r)
dependency_groups_table
```

```{python}
#| label: tbl-robust-regression-comparison
#| tbl-cap: "Determinants of Trade Dependency. The MM-estimator provides robust estimates with automatic outlier detection; Exclusion model removes identified outliers. Significance levels: *** p<0.001, ** p<0.01, * p<0.05, . p<0.1"
#| echo: false

# Load combined regression results with detailed outlier analysis
with open(here('output/combined_regression_results.json'), 'r') as f:
    combined_results = json.load(f)

# Extract all model results
ols_coeffs = pd.DataFrame(combined_results['ols']['coefficients'])
mm_coeffs = pd.DataFrame(combined_results['mm']['coefficients'])
exclusion_coeffs = pd.DataFrame(combined_results['exclusion']['coefficients'])

# Variable name mapping for clean display
var_names = {
    '(Intercept)': 'Constant',
    'trade_pct_gdp': 'Trade (% of GDP)',
    'log(gdp_per_capita_ppp)': 'Log GDP per capita',
    'log(population)': 'Log Population', 
    'total_natural_resources_rents_pct_gdp': 'Natural resources (% of GDP)'
}

def create_robust_comparison_table(ols_coeffs, mm_coeffs, exclusion_coeffs, var_names):
    """Create publication-ready robust regression comparison table"""
    
    combined_data = []
    
    for _, ols_row in ols_coeffs.iterrows():
        var_name = var_names.get(ols_row['variable'], ols_row['variable'])
        
        # Find corresponding MM and Exclusion results
        mm_row = mm_coeffs[mm_coeffs['variable'] == ols_row['variable']]
        exclusion_row = exclusion_coeffs[exclusion_coeffs['variable'] == ols_row['variable']]
        
        if len(mm_row) > 0 and len(exclusion_row) > 0:
            mm_row = mm_row.iloc[0]
            exclusion_row = exclusion_row.iloc[0]
            
            combined_data.append([
                var_name,
                f"{ols_row['estimate']:.3f}{ols_row['stars']}",
                f"({ols_row['std_error']:.3f})",
                f"{mm_row['estimate']:.3f}{mm_row['stars']}",
                f"({mm_row['std_error']:.3f})",
                f"{exclusion_row['estimate']:.3f}{exclusion_row['stars']}",
                f"({exclusion_row['std_error']:.3f})"
            ])
    
    # Add blank row
    combined_data.append(['', '', '', '', '', '', ''])
    
    # Add model statistics
    ols_stats = combined_results['ols']
    mm_stats = combined_results['mm']
    exclusion_stats = combined_results['exclusion']
    
    combined_data.extend([
        ['R-squared', f"{ols_stats['r_squared']:.3f}", '', 
         f"{mm_stats['r_squared']:.3f}" if mm_stats['r_squared'] else 'N/A', '',
         f"{exclusion_stats['r_squared']:.3f}", ''],
        ['Observations', f"{ols_stats['n_obs']}", '', 
         f"{mm_stats['n_obs']}", '', f"{exclusion_stats['n_obs']}", ''],
        ['Method', 'OLS', '', 'MM-Estimator', '', 'OLS (Excluded)', ''],
        ['Outlier treatment', 'Included', '', 'Downweighted', '', 'Excluded', ''],
        ['Countries affected', '-', '', 
         ', '.join(mm_stats['outliers_identified']), '',
         ', '.join(exclusion_stats['excluded_countries']), '']
    ])
    
    # Create DataFrame
    table = pd.DataFrame(combined_data, columns=[
        '', 'OLS Coef.', 'OLS SE', 'MM Coef.', 'MM SE', 'Excl. Coef.', 'Excl. SE'
    ])
    
    return table

# Create and display table
robust_table = create_robust_comparison_table(ols_coeffs, mm_coeffs, exclusion_coeffs, var_names)
robust_table
```


```{python}
#| echo: false

# Extract detailed statistics for inline text
outlier_stats = combined_results['outlier_analysis']
comparison_stats = combined_results['comparison']

# Key numbers for text
n_outliers = len(outlier_stats['outlier_statistics'])
max_std_residual = outlier_stats['max_standardized_residual']
max_percent_diff = outlier_stats['max_percent_difference']
intercept_percent_diff = outlier_stats['intercept_percent_diff']
trade_percent_diff = outlier_stats['trade_percent_diff']

# Extract specific country information
outlier_countries = outlier_stats['outlier_statistics']
ethiopia_residual = [x['standardized_residual'] for x in outlier_countries if x['country'] == 'ETH'][0]
ethiopia_weight = [x['mm_weight'] for x in outlier_countries if x['country'] == 'ETH'][0]

# Trade coefficient values
trade_ols = outlier_stats['trade_coef_ols']
trade_mm = outlier_stats['trade_coef_mm']
trade_exclusion = outlier_stats['trade_coef_exclusion']
```

Panels B and C of @fig-regional-vulnerability show the regional distributions of dependencies; however, there is no  clear regional pattern to identify: Countries in Latin America demonstrate the greatest heterogeneity, ranging from nearly zero (Guyana and Suriname) to over 30% (some Caribbean states). This results in slightly higher dependency than the global average. South Asian countries appear slightly less dependent on average. However, the Middle East and North Africa are slightly more dependent, with significant variation within the region. Finally, Sub-Saharan Africa has many countries with moderate to high dependency, as well as a significant portion of highly dependent countries with dependency shares well above 25%, on average.

This strong heterogeneity between and within regions raises the question of whether dependency is associated with common macroeconomic variables. To this end, @fig-macro-correlations visualizes correlations with some evident indicators, and @tbl-robust-regression-comparison quantifies these relationships using statistical analysis. The table shows how four country characteristics predict trade dependency, with results presented using three different statistical approaches to ensure the relationships are robust: a classical OLS regression, then a MM estimation, which deflates the impact of potential outlier cases (which diagnostic tests suggests to be relevant in the OLS context, see Appendix C), and an OLS regression with potential outlier being excluded manually. This robustness check reveals that results are extremely stable across the different estimation methods: all coefficient differences between MM-estimation and explicit exclusion are less than 
`{python} format_percentage(max_percent_diff, 1)` 
of the original OLS estimates.^[The diagnostic plots for the different models, as well as additional technical details, can be found in Appendix C.]


![Global South Trade Dependencies for individual countries and regions](../output/MacroCorrelationPlot.png){#fig-macro-correlations width=100%}

As expected, we observe a strong correlation between trade dependency and openness, as becomes evident in panel A of @fig-macro-correlations: Countries with higher trade intensity tend to be more vulnerable to demand reductions in the North. Our regression models confirm this pattern across all estimation approaches, with trade openness being a highly significant and stable predictor of dependency (@tbl-robust-regression-comparison).

More surprising is the relationship between dependency and wealth, as measured by a country's per capita GDP (in constant PPP). Panel B of @fig-macro-correlations suggests that wealthier countries have higher trade dependencies. This counterintuitive finding is confirmed across all our estimation approaches when we control for trade openness and other structural factors (@tbl-robust-regression-comparison). This suggests that wealthy, trade-integrated economies (e.g., Chile or Malaysia) face particular vulnerabilities. In other words, trade with the Global North appears to be an important source of these countries' monetary wealth, but it also makes them more vulnerable to degrowth in the North.

The relationship between trade dependency and population size is intricate. One might expect larger countries to have larger internal markets and, consequently, greater resilience. This conjecture appears even more plausible given the negative correlation between dependency share and population size shown in Panel C of @fig-macro-correlations. However, our robust regression results in @tbl-robust-regression-comparison show that this correlation masks an important confounding effect. Large countries tend to have higher trade volumes, which could increase their dependency on trade with the Global North. When controlling for other factors, the association parameter for population and dependency becomes positive across all estimation methods, though the magnitude varies slightly. This suggests that countries such as Brazil, Mexico, Nigeria, and Indonesia benefit from their size, but these advantages are partially obscured in simple comparisons due to their simultaneous integration into global trade networks.

Finally, panel D of @fig-macro-correlations shows a positive correlation between dependence on natural resources and trade dependency. This association remains significant across all our robust estimation approaches (@tbl-robust-regression-comparison). This suggests that resource-dependent countries often generate significant portions of their value added through exports to Northern countries - a finding consistent with literature on resource extractivism and dependent growth.^[
    To ensure our results are robust to outlying observations, we employ MM-estimation alongside explicit exclusion of identified outliers (@tbl-robust-regression-comparison). The MM-estimator identifies 
`{python} n_outliers` 
countries as outliers, with Ethiopia showing the most extreme deviation (standardized residual = 
`{python} format_number(ethiopia_residual)`
). The MM-estimator assigns Ethiopia zero weight while providing Libya partial weight (0.18), employing its automatic outlier detection capabilities.
The robustness check reveals very high stability across methods. All coefficient differences between MM-estimation and explicit exclusion are less than 
`{python} format_percentage(max_percent_diff, 1)` 
of the original OLS estimates. The trade openness coefficient—our key finding—shows remarkable consistency: 
`{python} format_number(trade_ols, 2)` (OLS), 
`{python} format_number(trade_mm, 2)` (MM-estimator), and 
`{python} format_number(trade_exclusion, 2)` (exclusion), representing only 
`{python} format_percentage(trade_percent_diff, 1)` variation. This close correspondence between MM-estimation and explicit exclusion confirms that our findings are not driven by outlying observations and validates the MM-estimator's automatic outlier handling. Overall, our regression analysis explains approximately 35% of the variation in dependency shares across countries.]

Future research could clarify the overall relationships or focus on interesting individual case studies. For example, Ethiopia shows an extremely high dependency despite its large population. In contrast, Nepal shows basically no dependency, and Malaysia shows strong dependence despite its relatively high wealth level.
Nevertheless, our results reveal systematic patterns that suggest trade dependency is not merely a function of economic development, geography, or history, but rather reflects the structural characteristics of economies' integration into global markets. 

# Discussion and Conclusion {#sec-discussion}

This paper has been a first attempt to quantify the so far unerresearched side of the "twin challenge of global dependencies" [@grabner-radkowitsch2023] in the context of degrowth. The twin challenge points out that, on the one hand, global dependencies are a *reason* for degrowth, assuming that degrowth in the North could scale back neocolonial trade and financial relationships with the South. Much of the quantitative degrowth literature so far has contributed to *this* side of the twin challenge, analyzing currently existing patterns of ecologically unequal exchange and highlighting neocolonial hierarchies in the global economy [e.g. @schaffartzik2019; -@dorninger2021; @hickel2024; @ricci2025a].
Here we have complemented this research by having on the *other* side of the twin challenge:
Our results show that significant dependencies do exist in some countries, with roughly a seventh of total incomes and profits in the South depending on trade with the North, with business profits being more vulnerable than incomes. Importantly, however, we found that dependency varies significantly by country, and does not follow a clear explanatory factor aside from trade openness. This suggests that more regionally specific future analyses are necessary to better understand this side of global dependency as well. 
It also shows that in a highly integrrated global economy, policy changes in any country can have important impacts on other countries, meaning that the idea that Northern countries should focus on scaling down their economic activity alone can be problematic: policy design in the North must take serious a country’s specific trade patterns with Southern economies and the corresponding implications. For the academic degrowth discourse this means that the search for strategies that take into account global dependencies of any kind is crucial.

But of course, there are certain limits to our approach that should be taken into account when interpreting our findings. Firstly, on the methodological side, input-output modelling, by its nature, is a static approach. It does not model or project structural adjustments that may happen as a response to hypothetical demand shocks. Therefore, we merely provide a snapshot of current trade relations that account for immediate economic vulnerability on part of the exporting partners *if* there was a reduction in demand. Secondly, on the substantive side, we have to caution against falling into the trap of seeing degrowth merely as a demand-reduction policy package. As Dengler and Seebacher -@dengler2019, for example, point out, most degrowth proponents do not envision degrowth to be a version of 'less of the same,'' where degrowth is understood unidimensionally as a rapid quantitative reduction of consumption and production in the North. Degrowth aspires to be holistic and *qualitatively* different, which includes a range of interventions on various levels and dimensions, many of which are not limited to the formal policy sphere, nor merely to economic factors [@dalisa2020]. We therefore see our study not primarily as a predictive exercise that shows what part of incomes and profits in the South would be lost 'if degrowth was implemented', but rather as part and parcel of a larger research undertaking - including qualitative and quantitative studies - that aims to better understand the specific parameters of the 'twin challenge of global dependencies'. This is a research project in its infancy, and we hope with this paper to contribute a first step toward a quantification of the obstacle side of the twin challenges.


# References

::: {#refs}
:::





